package com.company.manage.system.utils;


import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.StopWatch;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Created by HuangYong on 2016/1/23.
 * desc: 记录方法的执行时间
 */
public class MethodTimeAdvice implements MethodInterceptor {
    private static final String TAG = "MethodTimeAdvice";

    private static final Logger LOGGER = LoggerFactory.getLogger(MethodTimeAdvice.class);

    /**
     * 拦截要执行的目标方法
     *
     * @param invocation
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {

        //用 commons-lang3 提供的 StopWatch 计时，Spring 也提供了一个 StopWatch
        StopWatch clock = new StopWatch();
        clock.start();
        Object result = invocation.proceed();
        clock.stop();

        /*方法参数类型，转换成简单类型*/
        Class[] params = invocation.getMethod().getParameterTypes();
        String[] simpleParams = new String[params.length];

        for (int i = 0; i < simpleParams.length; i++) {
            simpleParams[i] = params[i].getSimpleName();
        }

        LOGGER.debug("Takes:" + clock.getTime() + " ms ["
                + invocation.getThis().getClass().getName() + "."
                + invocation.getMethod().getName() + "(" + StringUtils.join(simpleParams, ",") + ")] ");

        return result;
    }
}